package com.hjy.backend.dataManager.page;

import com.hjy.backend.dataManager.pageCache.PageCache;
import com.hjy.backend.utils.RandomUtil;

import java.util.Arrays;

/**
 * 第一页(首页)操作类
 * ValidCheck
 * db启动时给100~107字节处填入一个随机字节，db关闭时将其拷贝到 108~115 字节
 * 用于判断上一次数据库是否正常关闭, 如果是异常关闭，就需要执行数据的恢复流程。
 */
public class PageFirst {

    private static final int OF_VC = 100; // 开始写入的位置
    private static final int LEN_VC = 8; // 写入多少个字符

    /**
     * 数据库启动时执行这个方法, 判断上一次数据库启动是异常还是正常
     *
     * @return
     */
    public static byte[] InitRaw() {
        byte[] raw = new byte[PageCache.PAGE_SIZE];
        setVcOpen(raw);
        return raw;
    }

    /**
     * 随机一串字符放置到 100~107 的位置
     *
     * @param pg
     */
    public static void setVcOpen(Page pg) {
        pg.setDirty(true);
        setVcOpen(pg.getData());
    }

    /**
     * 随机一串字符放置到 100~107 的位置
     *
     * @param raw
     */
    private static void setVcOpen(byte[] raw) {
        System.arraycopy(RandomUtil.randomBytes(LEN_VC), 0, raw, OF_VC, LEN_VC);
    }

    /**
     * 将 100~107 拷贝到 108~115
     */
    public static void setVcClose(Page page) {
        page.setDirty(true);
        setVcClose(page.getData());
    }

    /**
     * 将 100~107 拷贝到 108~115
     *
     * @param raw
     */
    private static void setVcClose(byte[] raw) {
        System.arraycopy(raw, OF_VC, raw, OF_VC + LEN_VC, LEN_VC);
    }

    /**
     * 判断 100~107 和 108~115 的字符是否相等
     *
     * @param pg
     * @return
     */
    public static boolean checkVc(Page pg) {
        return checkVc(pg.getData());
    }

    private static boolean checkVc(byte[] raw) {
        return Arrays.equals(Arrays.copyOfRange(raw, OF_VC, OF_VC + LEN_VC), Arrays.copyOfRange(raw, OF_VC + LEN_VC, OF_VC + 2 * LEN_VC));
    }

}
